Shiny Workflow Presentation

Monica Alonso y Priscilla Minotti

Nuestro Objetivo hoy

Agilizar tres flujos/pasos de trabajo importantes de Shiny:

  • inicio ciclo de desarrollo crear aplicación, realizar cambios y experimentar con los resultados.

  • depuración de errores, típico ciclo donde pruebas, descubres qué salió mal con tu código y modificas para solucionarlo. Vuelves a empezar el ciclo hasta no detectar más errores.

  • reprex: Escribir un fragmento de código autónomo, pequeño, que ilustra un problema. Se usa para obtener ayuda de otras personas sin necesidad de conocer toda la aplicacion.

1. Agilizar Ciclo de Desarrollo

Si vamos a crear muchas ShinyApp, conviene acelerar los procesos de desarrollo.

Tenemos dos momentos que podemos agilizar:

  • 1.1 Creación de la aplicación: El esqueleto de la aplicación es siempre igual

  • 1.2 Ciclo modificar código < = > probar/obtener resultados Es un proceso que haremos muchas veces hasta obtener los resultados esperados. Es muy tedioso…

1.1 Creación de la aplicación

File-> New File -> R Script

Luego atajo shinyapp + Tab

File-> New File -> Shiny Web app

File-> New Project -> Shiny Application

Resultado: se generara un esqueleto de la aplicacion

Con Rscript

Con Shiny Web Application

1.2 Código < = > Probar

Ventana Emergente y Consola

- Escribe algo de código.
- Inicia app: `Cmd/Ctrl` + `Shift` + `Enter`.
- Experimenta con la aplicación.
- Cierra la aplicación.
- Volver al paso 1.

Background Jobs y Viewer

Ventana emergente y Consola

Viewer y Background Jobs

A Limpiar Errores

Depuracion (debugging)

Cuando empiezas a escribir código generalmente se presentan errores. Nos centraremos en 3 de los principales de errores que te puedes encontrar:

  • Obtienes un “error inesperado”. Shiny dará un seguimiento para averiguar donde ocurrió el error. El depurador interactivo ayuda!
  • No obtienes ningún error, pero algún valor es incorrecto. Aqui se debera utilizar el depurador interactivo y generar habilidades de investigador🔎.
  • Todos los valores son correctos, pero no se actualizan cuando lo esperas, éste es desafiante!!

Rastreo (Traceback)

Cuando tenemos un error inesperado:

  • En un script R podemos llamar a la funcion traceback() que muestra los pasos ejecutados.
  • En shiny no es posible ejecutar código mientras corre la shiny app, pero Shiny mostrará el rastreo automaticámente
f <- function(x) g(x)
g <- function(x) h(x)
h <- function(x) x * 2
f("a")

Traceback en Shiny

library(shiny)

f <- function(x) g(x)
g <- function(x) h(x)
h <- function(x) x * 2

ui <- fluidPage(
  selectInput("n", "N", 1:10),
  plotOutput("plot")
)

server <- function(input, output, session) {
  output$plot <- renderPlot({
    n <- f(input$n)
    plot(head(cars, n))
  }, res = 96)
}

shinyApp(ui, server)

El depurador interactivo (interactive debugger)

Es la herramienta más potente para investigar un error. Hay dos maneras de iniciar el depurador:

HERRAMIENTA

browser()

.

.

.

Debugger

VENTAJA

Funciona tambien en Shiny Puede ser condicional su procesamiento

Agregar puntos de interrupcion

DESVENTAJA

Ensucia Fuente (recordar eliminarlo)

.

No es tan sencillo ver las variables

browser()

if (input$value == "a") {
  browser()
}
# Or maybe
if (my_reactive() < 0) {
  browser()
}

Depurador Interactivo

Reprex

Un reprex es simplemente código R que funciona al copiarlo y pegarlo en una sesión de R en otro equipo. Aquí tenemos un reprex simple para una aplicación Shiny:

library(shiny)
ui <- fluidPage(
  selectInput("n", "N", 1:10),
  plotOutput("plot")
)
server <- function(input, output, session) {
  output$plot <- renderPlot({
    n <- input$n * 2
    plot(head(cars, n))
  })
}
shinyApp(ui, server)

Ejemplos reproducibles (reprex)

Se llama reprex a:

  • un ejemplo reproducible

  • un paquete de R en CRAN para hacer ejemplos reproducibles, que tambien esta incluido en tidyverse

  • una función del paquete :reprex: para hacer que tu código sea un ejemplo reproducible:

    reprex::reprex()

¿Qué es un reprex ?

  • Es un código que informa sobre un problema que tenemos y que sirve para que nos ayuden a encontrar una solución.

  • Se usa para postear en Slack, en Stackexchage, en RStudio community, como un Issue en Gitlab o Github, o en cualquier lugar donde querés pedir ayuda.

¿Cuáles son las características de un reprex?

  • Es de extensión mínima, incluye solo las lineas de codigo realmente necesarias.

  • Es autocontenido (carga todos los paquetes necesarios, crea todos los objetos necesarios)

  • Es reproducible (puede correrse)

  • Usa un conjunto de datos los mas pequeño y simple posible, preferentemente los que vienen con los paquetes instalados con R (ej. iris, mtcars) o una muestra que se generan en el mismo codigo

  • Presenta no sólo las líneas de código sino también las salidas como comentarios

  • Puede también incluir toda la información de la session donde se corrió y se presentó el problema.

Ventajas de un reprex

  • Evita copiar/pegar de la consola sin que los demas sepan qué paquetes y datos usaste.

  • Evita hacer capturas de pantalla de la sesion de R para comunicar un problema. No se tiene que reescribir todo!

  • El código corre sin problemas en cualquier computadora! Asi que si querés abrir una sesión nueva de R, lo abrís o lo pegas y lo corres!

  • Si no querés, no es necesario correr el código, porque también suele incluir las salidas.

  • En el proceso de crearlo suele encontrarse la solución al problema!

¿Cómo genero un reprex con el paquete reprex?

Empezar la sesión con library(reprex) en la consola (no lo llama tidyverse)

  • Armar el código del reprex

  • Opción 1. Correr en la consola `reprex()`, se genera el reprex y te lo muestra en el Viewer. Lo copiás y pegás donde corresponda.

  • Opción 2. Desde RStudio addins seleccionar REPREX y elegir las opciones mas convenientes segun la salida buscada

Lista de chequeo para hacer ejemplos reproducibles en Shiny (5.5.3)

  1. Todas las entradas y salidas de la UI estan relacionadas con el problema?

  2. Se puede simplificar el layout dejando sólo lo necesario?

  3. Hay reactives en el server() que se puedan remover?

  4. Necesitas todos los paquetes cargados para ilustrar el problema?

  5. Quitaste ya todo aquello que no funcionó?

¿Vemos los ejemplos del libro?

  • 5.3.1 reprex basics

  • 5.3.4 posteo de Scott Novogoratz en RStudio community

Materiales

Debugging

Reprex